package org.argus.common.core.utils;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * 反射工具类
 * @Author 刘文/Cliff Liu
 * @Date 2024/8/1
 */
@Slf4j
public class ReflectUtils {


    /**
     * 获取指定类所有字段(包括父类)
     * @param clazz
     * @return
     */
    public static List<Field> getAllFields(Class clazz) {
        List<Field> result = new LinkedList<>();
        Class tempClass = clazz;
        // 当父类为null的时候说明到达了最上层的父类(Object类).
        while (tempClass != null) {
            result.addAll(Arrays.asList(tempClass.getDeclaredFields()));
            tempClass = tempClass.getSuperclass(); // 得到父类,然后赋给自己
        }
        return result;
    }

    public static Field getField(Class clazz, String fieldName) {
        Field field = null;
        Class tempClass = clazz;
        // 当父类为null的时候说明到达了最上层的父类(Object类).
        while (tempClass != null && field == null) {
            try {
                field = tempClass.getDeclaredField(fieldName);
            } catch (NoSuchFieldException e) {
                //没找到就继续向父类找
            }
            tempClass = tempClass.getSuperclass();
        }
        return field;
    }

}
